﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
//引入Socket命名空间
using System.Net;
using System.Net.Sockets;
using SerialPortHelper;
namespace SocketHelper
{
    public class ServerHelper
    {
        private Socket socket = null;
        //记录通信用的Socket
      //  private Dictionary<string, Socket> SocketDic = null;
        #region 相关属性
        //IP地址
        public IPAddress IP { get; set; }
        //端口号
        public IPEndPoint Point { get; set; }   
        //同时监听客户端个数
        public int ListenCount { get; set; }
        public string ServerIP { get; set; }
        public int Port { get; set; }
        public string ClientPort { get; set; }
        public Dictionary<string, Socket> SocketDic { get; set; }
        #endregion
        public ServerHelper()
        {
            //创建监听用的Socket
              /*
              AddressFamily.InterNetWork：使用 IP4地址。

              SocketType.Stream：支持可靠、双向、基于连接的字节流，而不重复数据。此类型的 Socket 与单个对方主机进行通信，并且在通信开始之前需要远程主机连接。Stream 使用传输控制协议 (Tcp) ProtocolType 和 InterNetworkAddressFamily。

             ProtocolType.Tcp：使用传输控制协议。
             */
            //使用IPv4地址，流式socket方式，tcp协议传递数据
            this.socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            
            this.ListenCount = 20; //默认同时可以监听10个客户端
            SocketDic = new Dictionary<string, Socket>();
        }
        public void Listen()
        {
            this.IP = IPAddress.Parse(this.ServerIP);
            this.Point = new IPEndPoint(IP, this.Port);
            this.socket.Bind(this.Point); //socket监听哪个端口
            this.socket.Listen(this.ListenCount);//同一个时间点过来若干个客户端，排队          
        }
        public Socket AcceptInfo()
        {
            try
            {
                this.socket.Accept();//创建通信用的Socket
                string point = this.socket.RemoteEndPoint.ToString();
                this.SocketDic.Add(point, this.socket);
                return this.socket;
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }
        /// <summary>
        /// Socket接收数据
        /// </summary>
        /// <returns></returns>
        public byte[] SocketReceiveData(Socket objSocket)
        { 
                   //定义byte数组存放从客户端接收过来的数据
                    byte[] buffer = new byte[1024 * 1024];
                    //将接收过来的数据放到buffer中，并返回实际接受数据的长度
                    int n = objSocket.Receive(buffer);
                    return buffer;
        }
        public void SocketSendData(Socket objSocket, string data)
        {
            try
            {
                if (objSocket != null)
                {
                    byte[] buffer = new SerialPortHelper.AlgorithmHelper().From16ToBtyes(data);
                    objSocket.Send(buffer);
                }
                else throw new Exception("服务端没有打开");
            }
            catch (Exception ex)
            {
                
                throw new Exception("发送失败，该IP客户端已断开连接；错误信息："+ex.Message);
            }           
        }
        public void SocketSendData(Socket objSocket, byte[] data)
        {
            try
            {
                if (objSocket != null)
                {
                    //byte[] buffer = new SerialPortHelper.AlgorithmHelper().From16ToBtyes(data);
                    objSocket.Send(data);
                }
                else throw new Exception("服务端没有打开");
            }
            catch (Exception ex)
            {

                throw new Exception("发送失败，该IP客户端已断开连接；错误信息：" + ex.Message);
            }
        }
    }
    /// <summary>
    /// 发送格式选择【16进制或字符串】
    /// </summary>
    public enum SendFormat
    {
        Hex,//十六进制
        String
    }
}
